בשנים האחרונות היה לי מקרה אחד בלבד שבו הייתי צריך לכתוב את הפקודות die ו exit:
בראיון עבודה ביקשו ממני לכתוב שני דרכים לעצור את הביצוע של הסקריפט.
אבל אם כתבת את הפקודות האלה בתוך הקוד שלך - כנראה שאתה יורה לעצמך ברגל.
והנא למה:
הפקודה die עוצרת גם קוד שהוא לא שלך
א. זה לא מה שמתכנת מצפה
נניח שכתבת מחלקה ומישהו אחר משתמש בה. לא משנה עם זה אופן סורס, מישהו מצא אותה באינטרנט או חבר מהצוות שלך בעבודה. הוא בטוח לא מצפה שאיזה שגיאה או פרמטר לא נכון יגרמו לקוד להפסיק לעבוד על המקום.
מה שהוא מצפה לו במקרה הרע זה אקספשן. אקספשן זה הדרך האוניברסלית של מתכנת להגיד למתכנת אחר - אתה עושה משהו לא נכון עם הקוד שלי או משהו הולך לא לפי התוכנית. דוגמאות יש במדריך שבו רן בר זיק מסביר איך להשתמש ב try catch
ב. die משאיר קצוות פתוחים
תאר לעצמך שפתחת קובץ לקריאה, התחלת להאזין לנתונים מסוקט והתחברת לשרת חיצוני אחר, כדי להעביר לו נתונים כלשהם (כמו שרת מייל). על הדרך פתחת חיבור למסד נתונים ואתה גם באמצע טרנזקציה. ואז פתאום הסקריפט מופסק. אתה יכול לנחש מה קורה עם כל אותם משאבים פתוחים.
בטח ראית את ההודעה של מערכת ההפעלה שאי-אפשר למחוק קובץ כי מישהו אחר משתמש בו? זה מקרה לדוגמה.
ואתה צודק שדברים מסוימים יסגרו לבד אחרי שהסקריפט ימות. אבל לא כולם. מתכנתים שוברים ימים את הראש על איך לגרום לקוד להיות עמיד בפני הפסקת חשמל ולגרום לאחת כזאת בעצמך זה בהחלט רעיון רע.
שגיאות לא צריכות להגיע ללקוח
התוצאות יכולות להיות שונות. עמוד שמרונדר עד החצי,
הודעת שגיאה טכנית או מידע שלא אמור להופיע בשום מקום כמו נתוני התחברות למסד או api keys שונים.
ושוב לעזרתנו מגיעים אקספשנים שמאפשרים לך לתפוס את השגיאה ולהמשיך בתהליך אלנטרנטיבי,
שליחת הודעה למפתחים, הצגת הודעה מתאימה למשתמש או תיקון לפרמטרים של מטודה מסוימת.
ולסיכום: die זה קיצור דרך לסקריפט של 5 שורות במחשב הלוקאלי שלכם, אבל מעבר לזה -
die must die
ואגב, בראיון עצמו כתבתי שבע דרכים לעצור את הביצוע של הסקריפט. תהנה
עוד מדריך שאולי יעניין אותך: טיפול נכון בשגיאות שונות.
תגובות לכתבה:
אבל..
ב-WP לצורך העניין, אם אתה מטפל בקריאות של AJAX, אתה חייב בסוף הפונקציה לבצע die(), כי אז ה-WP עצמו יחזיר לך "-1", בשביל לספר לך שלא היה שום מחלקה שכן נגעה בזה.
אז כן יש מצבים שזה נרשם.. :)
תודה על ההערה.
למרות שלא ברור לי למה וורדפרס חושבים שזה בסדר לכתוב 1- בסוף כל בקשה
לא נכון,
הכללות תמיד לא נכונות ;)
אבל באמת עכשיו, יש הרבה מקרים שזה שימושי, לדוגמה כאשר אתה מפתח פריימוורק MVC והמתכנת עוד לא הגדיר Error Page והמערכת ראוטינג קיבלה בקשה לא חוקית.
וכשהמתכנת יגדיר עמוד כזה אתה תשלח לו גרסה חדשה של הפריימוורק שלך בלי die ?
פריימוורק זה המקום הכי אחרון הי פעם שבו צריך להיות die.
ולגבי הפריימורק שלך - תתפוס את השגיאה לבד ותציג עמוד שגיאה ברירת מחדל.
P.S. לפי דעתי, פריימורק זה המקום שבו אני מצפה בתור מתכת לקבל את השגיאה הכי מפורטת שאפשר שמסבירה מה לא הגדרתי, למה לא הגדרתי ואיך להגדיר את זה. ובטח שלא עמוד ריק לבן או הודעה "סליחה, לא עובד, תבין לבד". זה, בין היתר, קריטריון משמעוטי לבחירת פריימוורק.
die לעמוד שגיאה ברירת מחדל, מה הבעיה בזה?
כשיש שגיאות פנימיות במשהו שלמתכנת אין יכולת לתפוס אותו אין שום הסבר למה לא להשתמש בdie - להפך, חייבים להשתמש בdie. לעיתים אין מה לעשות אם הדברים פגומים לחלוטין. לא אמרתי שצריך להשתמש רק בdie.
דרך אגב, אני בקושי נוגע כבר בPHP. רק C#.
למה לשים die בעמוד שגיאה? הוא מוצג וזהו, סוף הסיפור.
לא ממש ברור לי למה אתה קורא שגיאות פנימיות שלמתכנת אין אפשרות לתפוס.
להציג עמוד שגיאה מבחינתי - זה לתפוס את השגיאה, להחליט שאי אפשר לטפל בה ואז לרנדר עמוד 500.
ושגיאות שאי אפשר לתפוס ב PHP אני לא מכיר.
למען האמת מכיר, אבל יש מעט כאלה, וגם אותם תופסים. אומנם לא הקוד שלך, אלה השרת ווב שלך, או cgi manager או מישהו אחר רמה מעל.
הצגת עמוד שגיאה ואז לצאת מהתוכנית, אלה מה? ואיך יוצאים מהתוכנית?
לא יוצאים מתוכנית...
תלוי גם מה אתה מתכנן לכתוב.. וזה גם תלוי ברמת הקלאס שלך..
כן יוצאים.
דרך אגב במקרה של פריימוורק המתכנת כן מצה שהפריימוורק ישלח בשבילו דף שגיאה ומצפה שיעבור אליו קלט שעבר את הולידציות הבסיסיות של הפריימוורק. זה העניין בפרימוורק
אני די בטוח שבתכניות C# שלך אתה לא יוצא מהתוכנית.
בין היתר כי שם מעצבי השפה חשבו באותה צורה - אין שום סיבה לזה.
אם יש לך סיבה לצאת מהתוכנית זה אומר שיש לך מקום לשים בו if / else / throw במקום.
בתוכנית C# שלי אני אוהב עם פריימוורק ASP NET שיוצא מהתוכנה בשבילי, לכן אני לא צריך.
הוא לא יוצא !באמצע! התוכנה אף פעם. הוא מגיע לסיום באחד מנטיבי הקוד האפשריים.
וגם אתה בתור מתכנת תמיד רוצה להביא את התוכנה לנתיב סיום סביר
:|
אם יש שגיאה בשאילתה, 404 לשם דוגמה, אז אתה כן צריך לבצע מתודת יציאה סגירה וכו' (dispose בשפות נורמליות) ולסיים את ריצת התוכנית!
אתה אומר את זה כאילו למעלה כתוב שתכניות אף פעם לא צריכות להסתיים ותמיד רצות עד אין סוף.
אם זה לא ברור מהכתבה - תכנית ב PHP צריכה להסתיים. אבל לא על ידי die אלה על ידי flow מסוים.
בקוד דוט נט שלך במקרה של שגיאה אתה לא קוטע את התכנית, אתה עובר ל flow אלטרנטיבי של הצגת עמוד שגיאה, קריאה ל dispose, וכו'. תעשה אותו דבר ב PHP.
ודווקא במקרה של asp.net התכנית בכלל לא מסתיימת אחרי שנגמרת הבקשה ואתה רואה דף 404. שם היא ממשיכה לעבוד עוד הרבה, פשוט רץ קוד שלא אתה כתבת.